查看原文
其他

利用Xposed对ollvm后的so中flag爆破

PTRer 看雪学苑 2022-07-01

本文为看雪论坛文章

看雪论坛作者ID:PTRer



本文为看雪安卓高研2w班(7月班)优秀学员作品。


下面先让我们来看看学员的学习心得吧!


学员感想


本题目出自2W班7月第二题。 

题目要求:

请编写Xposed插件完对该app的flag的暴破(已知so中test函数参数为一个字符串,该字符串长度为3且仅包含大小写字母)。

 

解题思路:

首先分析ollvm控制流混淆的so找到关键函数,然后分析Android8.1源码加载so的函数并编写Xposed插件hook之,最后基于sandhook框架编写爆破so。

 

考察知识点:

ollvm控制流混淆代码的分析方法,以及利用Xposed对so中函数的主动调用。


ps. 题目附件请点击“阅读原文”下载。




解题过程


1.分析ollvm控制流混淆的so找到关键函数


首先利用Jadx软件打开apk,核心代码如下,将用户输入字符串作为参数调用jni函数jnitest进行判断。然后将libnative-lib.so拉入IDA进行分析,Java_com_kanxue_test2_MainActivity_jnitest函数中有多个嵌套while循环,仔细分析,类似状态机,这就是ollvm控制流混淆。
jnitest函数会先调用下图line98行的sub_103C0函数,将sub_103C0转换后的字符串地址作为参数调用test函数,test的返回结果为非0,则jnitest的结果也为非0。
另外针对ollvm控制流混淆分析还有一个小技巧,就是从后往前分析,会更快找到关键函数。根据题目要求,已知so中test函数参数为一个字符串,该字符串长度为3且仅包含大小写字母,所以我们可以采用暴力破解的方法,枚举所有符合条件的字符串,使得test函数返回非0。 2.分析Android8.1源码找到加载so函数并编写Xposed插件hook
我们需要在APK调用加载so时进行hook,所以我们hook住System类的loadLibrary就行。因为我手机是Pixel+Android8.1+Edxposed,所以查看Android8.1源码,如下所示,由于这个函数内部会修改classloader,所以我们去hook这两个函数的内部调用的Runtime类中的loadLibrary0函数。这里需要注意不同Android版本,调用的Runtime类中的函数名和参数顺序是不同的。下面编写Xposed插件去hook住Runtime类中的loadLibrary0函数,核心xposed代码如下所示,在样本apk加载so后,加载自定义的hookso.so动态库,然后在自定义的so中实现对test函数的爆破。3.基于sandhook框架编写爆破so
我们选择sandhook框架,理由是它可以hook住arm32或者arm64下的so中函数。首先我们在IDA中查找下test函数的偏移地址如下,为0XF9A0。然后编写主动调用test的代码,核心代码如下:因为sandhook框架会用到init函数,需要保证sandhook模块初始化完才能进行hook,所以上面的代码封装的函数,需要在JNI_OnLoad中调用。
最后将生成的so文件拷贝到pixel手机/data/data/com.kanxue.test2/files路径下,并关闭selinux进行爆破,最终得到flag为“XuE”。




- End -


看雪ID:PTRer

https://bbs.pediy.com/user-home-874618.htm

  *本文由看雪论坛 PTRer 原创,转载请注明来自看雪社区。


好消息!!现在看雪《安卓高级研修班》线下班 & 网课(12月班)开始同步招生啦!以前没报上高研班的小伙伴赶快抓紧机会报名,升职加薪唾手可得!!



推荐文章++++

* 一个易上手的函数抽取样本还原

* 编写单机游戏连连看辅助的全过程

* frida跟踪应用中所有运行在解释模式的java函数

* Sapido多款路由器命令执行

* Largebin attack总结






公众号ID:ikanxue
官方微博:看雪安全商务合作:wsc@kanxue.com



求分享

求点赞

求在看


“阅读原文”一起来充电吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存